@tutti-os/agent-gui 0.0.189 → 0.0.191

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/dist/AgentRichTextReadonly-HJQQ4KAL.js +19 -0
  2. package/dist/agent-conversation/index.d.ts +29 -15
  3. package/dist/agent-conversation/index.js +11 -11
  4. package/dist/agent-env/index.js +1 -1
  5. package/dist/agent-gui.d.ts +315 -13
  6. package/dist/agent-gui.js +23 -23
  7. package/dist/agent-message-center/index.d.ts +4 -7
  8. package/dist/agent-message-center/index.js +9 -9
  9. package/dist/{agentGuiNodeTypes-DAT3XJON.d.ts → agentGuiNodeTypes-B23ubO8n.d.ts} +21 -3
  10. package/dist/agents.d.ts +2 -1
  11. package/dist/app/renderer/agentactivity.css +20 -3
  12. package/dist/{chunk-YSA4MXR5.js → chunk-4CHBM3G3.js} +9 -3
  13. package/dist/chunk-4CHBM3G3.js.map +1 -0
  14. package/dist/{chunk-NCD5I4OB.js → chunk-5VECGOBU.js} +3 -3
  15. package/dist/{chunk-F5YFT4VB.js → chunk-73FNXLC6.js} +5431 -2202
  16. package/dist/chunk-73FNXLC6.js.map +1 -0
  17. package/dist/{chunk-AODSTIED.js → chunk-AFUVWWQY.js} +2 -2
  18. package/dist/{chunk-MHOYBRCY.js → chunk-CBMWHQ7P.js} +1 -1
  19. package/dist/chunk-CBMWHQ7P.js.map +1 -0
  20. package/dist/{chunk-THBCAUBR.js → chunk-CXC3ROXQ.js} +2 -2
  21. package/dist/{chunk-THBCAUBR.js.map → chunk-CXC3ROXQ.js.map} +1 -1
  22. package/dist/{chunk-CAZ7NYUE.js → chunk-DKGFEIZ7.js} +2 -2
  23. package/dist/{chunk-5UTK6FDH.js → chunk-DNHDR2YC.js} +3 -3
  24. package/dist/{chunk-U7GYZU6V.js → chunk-E2Y4FFQW.js} +5 -5
  25. package/dist/{chunk-KAF6JPGL.js → chunk-FGD2K7AB.js} +3 -3
  26. package/dist/chunk-FGD2K7AB.js.map +1 -0
  27. package/dist/{chunk-ZREBC77R.js → chunk-G7DS23D4.js} +2 -2
  28. package/dist/{chunk-VGUKS6JR.js → chunk-I4ICM3U4.js} +297 -43
  29. package/dist/chunk-I4ICM3U4.js.map +1 -0
  30. package/dist/{chunk-6II57C72.js → chunk-KDN6SLJM.js} +2 -2
  31. package/dist/{chunk-E5X3DSQZ.js → chunk-L3YCXXMA.js} +9 -9
  32. package/dist/{chunk-2674YZOF.js → chunk-M6HTOCQK.js} +3 -3
  33. package/dist/{chunk-SZVHT57M.js → chunk-MGSRWYRN.js} +2 -2
  34. package/dist/{chunk-5CLSJWUN.js → chunk-O433KXLK.js} +8 -1
  35. package/dist/chunk-O433KXLK.js.map +1 -0
  36. package/dist/{chunk-Z5IASLIU.js → chunk-PFTST5V6.js} +4 -4
  37. package/dist/{chunk-LLIM2OX6.js → chunk-S7OROGUS.js} +2 -2
  38. package/dist/{chunk-BVA5SVOD.js → chunk-U6TH4RJJ.js} +1394 -784
  39. package/dist/chunk-U6TH4RJJ.js.map +1 -0
  40. package/dist/{chunk-ETJFWUCA.js → chunk-V2BMPPOE.js} +4 -4
  41. package/dist/{chunk-OKBVGNH7.js → chunk-Z5Y3RB2U.js} +2 -2
  42. package/dist/{chunk-V3QHMEJZ.js → chunk-ZE6VLLFC.js} +51 -4
  43. package/dist/chunk-ZE6VLLFC.js.map +1 -0
  44. package/dist/context-mention-palette/index.js +10 -10
  45. package/dist/context-mention-provider.d.ts +1 -0
  46. package/dist/{contribution-C0MnLVKF.d.ts → contribution-DfeuQHH6.d.ts} +39 -0
  47. package/dist/conversation-rail-runtime.d.ts +10 -3
  48. package/dist/dock-icons.js +2 -2
  49. package/dist/i18n/index.d.ts +370 -168
  50. package/dist/i18n/index.js +2 -2
  51. package/dist/index.d.ts +1199 -580
  52. package/dist/index.js +23 -23
  53. package/dist/index.js.map +1 -1
  54. package/dist/mention-search.js +8 -8
  55. package/dist/planImplementationPresentation-BxVOLt6A.d.ts +24 -0
  56. package/dist/provider-identity.js +1 -1
  57. package/dist/{types-CWFDZVkv.d.ts → types-CWKbqBmi.d.ts} +44 -0
  58. package/dist/workbench/contribution.d.ts +1 -1
  59. package/dist/workbench/contribution.js +10 -10
  60. package/dist/workbench/index.d.ts +2 -2
  61. package/dist/workbench/index.js +10 -10
  62. package/dist/workbench/launch.d.ts +4 -0
  63. package/dist/workbench/launch.js +4 -4
  64. package/dist/workbench/providerCatalog.js +2 -2
  65. package/dist/workbench/sessionTitle.js +3 -3
  66. package/dist/workbench/state.js +3 -3
  67. package/dist/workbench/types.d.ts +3 -0
  68. package/dist/workbench/types.js +1 -1
  69. package/dist/{agentConversationVM-CYXZSrh9.d.ts → workspaceLinkActions-BmVLZszV.d.ts} +110 -73
  70. package/package.json +14 -14
  71. package/dist/AgentRichTextReadonly-OKZPTCIX.js +0 -19
  72. package/dist/chunk-5CLSJWUN.js.map +0 -1
  73. package/dist/chunk-BVA5SVOD.js.map +0 -1
  74. package/dist/chunk-F5YFT4VB.js.map +0 -1
  75. package/dist/chunk-KAF6JPGL.js.map +0 -1
  76. package/dist/chunk-MHOYBRCY.js.map +0 -1
  77. package/dist/chunk-V3QHMEJZ.js.map +0 -1
  78. package/dist/chunk-VGUKS6JR.js.map +0 -1
  79. package/dist/chunk-YSA4MXR5.js.map +0 -1
  80. /package/dist/{AgentRichTextReadonly-OKZPTCIX.js.map → AgentRichTextReadonly-HJQQ4KAL.js.map} +0 -0
  81. /package/dist/{chunk-NCD5I4OB.js.map → chunk-5VECGOBU.js.map} +0 -0
  82. /package/dist/{chunk-AODSTIED.js.map → chunk-AFUVWWQY.js.map} +0 -0
  83. /package/dist/{chunk-CAZ7NYUE.js.map → chunk-DKGFEIZ7.js.map} +0 -0
  84. /package/dist/{chunk-5UTK6FDH.js.map → chunk-DNHDR2YC.js.map} +0 -0
  85. /package/dist/{chunk-U7GYZU6V.js.map → chunk-E2Y4FFQW.js.map} +0 -0
  86. /package/dist/{chunk-ZREBC77R.js.map → chunk-G7DS23D4.js.map} +0 -0
  87. /package/dist/{chunk-6II57C72.js.map → chunk-KDN6SLJM.js.map} +0 -0
  88. /package/dist/{chunk-E5X3DSQZ.js.map → chunk-L3YCXXMA.js.map} +0 -0
  89. /package/dist/{chunk-2674YZOF.js.map → chunk-M6HTOCQK.js.map} +0 -0
  90. /package/dist/{chunk-SZVHT57M.js.map → chunk-MGSRWYRN.js.map} +0 -0
  91. /package/dist/{chunk-Z5IASLIU.js.map → chunk-PFTST5V6.js.map} +0 -0
  92. /package/dist/{chunk-LLIM2OX6.js.map → chunk-S7OROGUS.js.map} +0 -0
  93. /package/dist/{chunk-ETJFWUCA.js.map → chunk-V2BMPPOE.js.map} +0 -0
  94. /package/dist/{chunk-OKBVGNH7.js.map → chunk-Z5Y3RB2U.js.map} +0 -0
@@ -0,0 +1,19 @@
1
+ import {
2
+ AgentRichTextReadonly
3
+ } from "./chunk-S7OROGUS.js";
4
+ import "./chunk-5VECGOBU.js";
5
+ import "./chunk-3V5OCA2M.js";
6
+ import "./chunk-FGLQZ6I4.js";
7
+ import "./chunk-ZVYUTXQJ.js";
8
+ import "./chunk-M6HTOCQK.js";
9
+ import "./chunk-DKGFEIZ7.js";
10
+ import "./chunk-5BJYO6X3.js";
11
+ import "./chunk-AFUVWWQY.js";
12
+ import "./chunk-I4ICM3U4.js";
13
+ import "./chunk-D2JUDUYY.js";
14
+ import "./chunk-QNE2ZPPV.js";
15
+ import "./chunk-O433KXLK.js";
16
+ export {
17
+ AgentRichTextReadonly
18
+ };
19
+ //# sourceMappingURL=AgentRichTextReadonly-HJQQ4KAL.js.map
@@ -1,19 +1,26 @@
1
1
  import * as react from 'react';
2
- import { ReactNode, JSX } from 'react';
3
- import { c as AgentConversationVM, g as WorkspaceLinkAction, f as WorkspaceAgentSessionDetailViewModel } from '../agentConversationVM-CYXZSrh9.js';
4
- export { B as BuildWorkspaceAgentSessionDetailInput, W as WorkspaceAgentActivityCard, e as WorkspaceAgentActivityTimelineItem, h as buildWorkspaceAgentSessionDetailViewModel } from '../agentConversationVM-CYXZSrh9.js';
5
- import { d as AgentGUIProviderSkillOption, h as AgentMessageMarkdownWorkspaceAppIcon } from '../agentGuiNodeTypes-DAT3XJON.js';
2
+ import { ReactNode, Ref, JSX } from 'react';
3
+ import { c as AgentConversationVM, g as WorkspaceLinkAction, f as WorkspaceAgentSessionDetailViewModel } from '../workspaceLinkActions-BmVLZszV.js';
4
+ export { B as BuildWorkspaceAgentSessionDetailInput, W as WorkspaceAgentActivityCard, e as WorkspaceAgentActivityTimelineItem, h as buildWorkspaceAgentSessionDetailViewModel } from '../workspaceLinkActions-BmVLZszV.js';
5
+ import { d as AgentGUIProviderSkillOption, h as AgentMessageMarkdownWorkspaceAppIcon } from '../agentGuiNodeTypes-B23ubO8n.js';
6
6
  import { AgentActivityMessage } from '@tutti-os/agent-activity-core';
7
7
  import '@tutti-os/workspace-issue-manager/core';
8
- import '../types-CWFDZVkv.js';
8
+ import '../types-CWKbqBmi.js';
9
+ import '../planImplementationPresentation-BxVOLt6A.js';
9
10
  import '@tutti-os/workspace-user-project/contracts';
10
11
 
11
- interface AgentConversationFlowProps {
12
- conversation: AgentConversationVM | null;
13
- isLoading: boolean;
14
- loadingLabel: string;
15
- loadingTestId?: string;
16
- empty: ReactNode;
12
+ interface AgentTranscriptTurnAttachment {
13
+ id: string;
14
+ anchorTurnId: string | null;
15
+ content: ReactNode;
16
+ }
17
+ type AgentTranscriptAttachmentLocator = (attachmentId: string) => void;
18
+
19
+ interface AgentTranscriptViewProps {
20
+ conversation: AgentConversationVM;
21
+ turnAttachments?: readonly AgentTranscriptTurnAttachment[];
22
+ turnAttachmentLocatorRef?: Ref<AgentTranscriptAttachmentLocator>;
23
+ onTurnAttachmentVisibilityChange?: (attachmentId: string, visible: boolean) => void;
17
24
  onLinkAction?: (action: WorkspaceLinkAction) => void;
18
25
  onAuthLogin?: (provider?: string | null) => void;
19
26
  availableSkills?: readonly AgentGUIProviderSkillOption[];
@@ -29,10 +36,17 @@ interface AgentConversationFlowProps {
29
36
  userMessageLocator?: string;
30
37
  };
31
38
  }
32
- declare const AgentConversationFlow: react.NamedExoticComponent<AgentConversationFlowProps>;
39
+ declare const AgentTranscriptView: react.NamedExoticComponent<AgentTranscriptViewProps>;
33
40
 
34
- interface AgentTranscriptViewProps {
35
- conversation: AgentConversationVM;
41
+ interface AgentConversationFlowProps {
42
+ conversation: AgentConversationVM | null;
43
+ turnAttachments?: readonly AgentTranscriptTurnAttachment[];
44
+ turnAttachmentLocatorRef?: Ref<AgentTranscriptAttachmentLocator>;
45
+ onTurnAttachmentVisibilityChange?: (attachmentId: string, visible: boolean) => void;
46
+ isLoading: boolean;
47
+ loadingLabel: string;
48
+ loadingTestId?: string;
49
+ empty: ReactNode;
36
50
  onLinkAction?: (action: WorkspaceLinkAction) => void;
37
51
  onAuthLogin?: (provider?: string | null) => void;
38
52
  availableSkills?: readonly AgentGUIProviderSkillOption[];
@@ -48,7 +62,7 @@ interface AgentTranscriptViewProps {
48
62
  userMessageLocator?: string;
49
63
  };
50
64
  }
51
- declare const AgentTranscriptView: react.NamedExoticComponent<AgentTranscriptViewProps>;
65
+ declare const AgentConversationFlow: react.NamedExoticComponent<AgentConversationFlowProps>;
52
66
 
53
67
  declare function AgentTranscriptSkeleton({ label, testId }: {
54
68
  label: string;
@@ -7,29 +7,29 @@ import {
7
7
  reconcileProjectedAgentConversationVM,
8
8
  serializeAgentConversationForClipboard,
9
9
  useProjectedAgentConversation
10
- } from "../chunk-BVA5SVOD.js";
11
- import "../chunk-LLIM2OX6.js";
12
- import "../chunk-THBCAUBR.js";
10
+ } from "../chunk-U6TH4RJJ.js";
11
+ import "../chunk-S7OROGUS.js";
12
+ import "../chunk-CXC3ROXQ.js";
13
13
  import "../chunk-XJ34OIEQ.js";
14
14
  import "../chunk-JDVP33S5.js";
15
- import "../chunk-NCD5I4OB.js";
15
+ import "../chunk-5VECGOBU.js";
16
16
  import "../chunk-3V5OCA2M.js";
17
17
  import "../chunk-FGLQZ6I4.js";
18
- import "../chunk-Z5IASLIU.js";
18
+ import "../chunk-PFTST5V6.js";
19
19
  import "../chunk-ZVYUTXQJ.js";
20
- import "../chunk-KAF6JPGL.js";
20
+ import "../chunk-FGD2K7AB.js";
21
21
  import "../chunk-F5UR6EJG.js";
22
- import "../chunk-2674YZOF.js";
22
+ import "../chunk-M6HTOCQK.js";
23
23
  import {
24
24
  translate
25
- } from "../chunk-CAZ7NYUE.js";
25
+ } from "../chunk-DKGFEIZ7.js";
26
26
  import "../chunk-5BJYO6X3.js";
27
- import "../chunk-AODSTIED.js";
28
- import "../chunk-VGUKS6JR.js";
27
+ import "../chunk-AFUVWWQY.js";
28
+ import "../chunk-I4ICM3U4.js";
29
29
  import "../chunk-MIJXEELH.js";
30
30
  import "../chunk-D2JUDUYY.js";
31
31
  import "../chunk-QNE2ZPPV.js";
32
- import "../chunk-5CLSJWUN.js";
32
+ import "../chunk-O433KXLK.js";
33
33
 
34
34
  // shared/WorkspaceAgentSessionDetail.tsx
35
35
  import { useMemo } from "react";
@@ -12,7 +12,7 @@ import {
12
12
  shouldAdvanceReveal,
13
13
  stageRemediation,
14
14
  useOpenAgentEnvPanel
15
- } from "../chunk-THBCAUBR.js";
15
+ } from "../chunk-CXC3ROXQ.js";
16
16
  export {
17
17
  AgentEnvPanelActionProvider,
18
18
  buildAgentEnvWizardViewModel,
@@ -1,21 +1,22 @@
1
1
  import * as react from 'react';
2
2
  import { ReactNode } from 'react';
3
3
  import { I18nRuntime } from '@tutti-os/ui-i18n-runtime';
4
- import { AgentActivityGoalControlInput, AgentActivityGoalControlResult, AgentActivityCreateSessionInput, AgentActivitySession, AgentActivityDeleteSessionInput, AgentActivityDeleteSessionResult, AgentActivitySendInput, AgentActivitySessionSettings, AgentActivityInitialGoalControl, AgentActivityActivateSessionResult, AgentActivitySnapshot, AgentSessionEngine, AgentActivityMessageOrder, AgentActivityMessagePage, AgentActivitySendInputResult, AgentActivityRenameSessionInput, AgentActivitySubmitInteractiveInput, AgentActivitySubmitInteractiveResult, AgentActivitySnapshotListener, AgentActivitySubmitSettingsPatch } from '@tutti-os/agent-activity-core';
5
- import { k as AgentHostAgentSessionComposerSettings, o as AgentHostUnactivateAgentSessionResult, b as AgentGUIAgentTarget, f as AgentGUIProvider, p as AgentPromptContentBlock, e as AgentGUINodeData, P as Point, g as AgentGUIProviderRailAllPresentation, h as AgentGUIProviderRailMode, i as AgentGUIProviderReadinessGate, d as AgentGUIHomeSuggestionId, N as NodeFrame, a as AgentGUIAgentDirectorySnapshot, c as AgentGUIAllAgentsPresentation } from './types-CWFDZVkv.js';
6
- import { A as AgentComposerDraft, i as AgentSessionCommand, d as AgentGUIProviderSkillOption, b as AgentGUIComposerSettingsVM, e as AgentGUIQueueStatus, f as AgentGUIQueuedPromptVM, h as AgentMessageMarkdownWorkspaceAppIcon, j as AgentSlashCommandCapability, c as AgentGUINodeViewModel, a as AgentComposerDraftFile, k as AgentUsageQuota, g as AgentHostInputApi } from './agentGuiNodeTypes-DAT3XJON.js';
4
+ import { AgentActivityGoalControlInput, AgentActivityGoalControlResult, AgentActivityCreateSessionInput, AgentActivitySession, AgentActivityDeleteSessionInput, AgentActivityDeleteSessionResult, AgentActivitySendInput, AgentActivitySessionSettings, AgentActivityActivateSessionResult, AgentActivityUpdateTuttiModeActivationInput, AgentActivityUpdateTuttiModeActivationResult, AgentActivitySnapshot, AgentSessionEngine, AgentActivityMessageOrder, AgentActivityMessagePage, AgentActivitySendInputResult, AgentActivityRenameSessionInput, AgentActivitySetCollaborationAdoptionInput, AgentActivityCollaborationRun, AgentActivitySubmitInteractiveInput, AgentActivitySubmitInteractiveResult, AgentActivitySnapshotListener, AgentActivitySubmitSettingsPatch } from '@tutti-os/agent-activity-core';
5
+ import { k as AgentHostAgentSessionComposerSettings, o as AgentHostUnactivateAgentSessionResult, b as AgentGUIAgentTarget, f as AgentGUIProvider, p as AgentPromptContentBlock, e as AgentGUINodeData, P as Point, g as AgentGUIProviderRailAllPresentation, h as AgentGUIProviderRailMode, i as AgentGUIProviderReadinessGate, d as AgentGUIHomeSuggestionId, N as NodeFrame, a as AgentGUIAgentDirectorySnapshot, c as AgentGUIAllAgentsPresentation } from './types-CWKbqBmi.js';
6
+ import { A as AgentComposerDraft, i as AgentSessionCommand, d as AgentGUIProviderSkillOption, b as AgentGUIComposerSettingsVM, e as AgentGUIQueueStatus, f as AgentGUIQueuedPromptVM, h as AgentMessageMarkdownWorkspaceAppIcon, j as AgentSlashCommandCapability, c as AgentGUINodeViewModel, a as AgentComposerDraftFile, k as AgentUsageQuota, g as AgentHostInputApi } from './agentGuiNodeTypes-B23ubO8n.js';
7
7
  import { WorkspaceFileReference, ReferenceLocateTarget, WorkspaceFileReferenceAdapter, ReferenceProvenanceCatalog } from '@tutti-os/workspace-file-reference/contracts';
8
8
  export { ReferenceProvenanceCatalog as AgentGUIReferenceProvenanceFilterCatalog } from '@tutti-os/workspace-file-reference/contracts';
9
9
  import { A as AgentContextMentionItem } from './agentFileMentionContracts-B0yQizXB.js';
10
10
  import { A as AgentGuiI18nLocale } from './runtime-Dwf44VKc.js';
11
11
  import { WorkspaceFileEntry } from '@tutti-os/workspace-file-manager/services';
12
12
  import { ReferenceSourceAggregator } from '@tutti-os/workspace-file-reference/core';
13
- import { b as AgentConversationPromptVM, g as WorkspaceLinkAction } from './agentConversationVM-CYXZSrh9.js';
13
+ import { b as AgentConversationPromptVM, g as WorkspaceLinkAction } from './workspaceLinkActions-BmVLZszV.js';
14
14
  import { WorkspaceUserProjectI18nRuntime } from '@tutti-os/workspace-user-project/i18n';
15
15
  import { WorkspaceUserProjectSelectChangeAction } from '@tutti-os/workspace-user-project/ui';
16
16
  import { WorkspaceUserProject } from '@tutti-os/workspace-user-project/contracts';
17
17
  import { ReferenceProvenanceFilterSnapshot, ReferenceProvenanceFilterController } from '@tutti-os/workspace-file-reference/react';
18
18
  import { RichTextMentionService } from '@tutti-os/ui-rich-text/service';
19
+ import './planImplementationPresentation-BxVOLt6A.js';
19
20
  import '@tutti-os/workspace-issue-manager/core';
20
21
 
21
22
  declare const APP_UPDATE_POLICIES: readonly ["off", "prompt", "auto"];
@@ -178,6 +179,7 @@ interface AgentActivityRuntimeDiagnosticInput {
178
179
  }
179
180
  interface AgentActivityRuntimeActivateSessionInputBase {
180
181
  agentSessionId: string;
182
+ capabilityRefs?: AgentActivityCreateSessionInput["capabilityRefs"];
181
183
  cwd?: string;
182
184
  initialContent?: AgentActivitySendInput["content"];
183
185
  /** 仅展示用首轮文本(bundle 折叠成一个 chip);initialContent 仍带展开后的文件。 */
@@ -192,12 +194,11 @@ interface AgentActivityRuntimeActivateSessionInputBase {
192
194
  type AgentActivityRuntimeActivateSessionInput = (AgentActivityRuntimeActivateSessionInputBase & {
193
195
  agentTargetId: string;
194
196
  clientSubmitId: string;
195
- initialGoalControl?: AgentActivityInitialGoalControl;
197
+ initialTuttiModeActivation?: AgentActivityCreateSessionInput["initialTuttiModeActivation"];
196
198
  mode: "new";
197
199
  }) | (AgentActivityRuntimeActivateSessionInputBase & {
198
200
  agentTargetId?: string | null;
199
201
  clientSubmitId?: never;
200
- initialGoalControl?: never;
201
202
  mode: "existing";
202
203
  });
203
204
  interface AgentActivityRuntimeUnactivateSessionInput {
@@ -326,6 +327,7 @@ interface AgentActivityRuntime {
326
327
  getSession(workspaceId: string, agentSessionId: string): Promise<AgentActivitySession>;
327
328
  getComposerOptions(input: AgentActivityRuntimeGetComposerOptionsInput): Promise<unknown>;
328
329
  updateSessionSettings(input: AgentActivityRuntimeUpdateSessionSettingsInput): Promise<AgentActivityRuntimeUpdateSessionSettingsResult>;
330
+ updateTuttiModeActivation(input: AgentActivityUpdateTuttiModeActivationInput): Promise<AgentActivityUpdateTuttiModeActivationResult>;
329
331
  getSnapshot(workspaceId: string): AgentActivitySnapshot;
330
332
  getSessionEngine(workspaceId: string): AgentSessionEngine;
331
333
  getSessionSectionsQueryCache?(workspaceId: string): WorkspaceQueryCache<unknown>;
@@ -345,6 +347,11 @@ interface AgentActivityRuntime {
345
347
  readSessionAttachment?(input: AgentActivityRuntimeReadSessionAttachmentInput): Promise<AgentActivityRuntimeSessionAttachment>;
346
348
  readPromptAsset?(input: AgentActivityRuntimeReadPromptAssetInput): Promise<AgentActivityRuntimePromptAsset>;
347
349
  renameSession(input: AgentActivityRenameSessionInput): Promise<AgentActivitySession>;
350
+ /**
351
+ * Record whether a collaboration outcome was adopted.
352
+ * Optional; hosts without support omit it and adoption controls stay hidden.
353
+ */
354
+ setCollaborationAdoption?(input: AgentActivitySetCollaborationAdoptionInput): Promise<AgentActivityCollaborationRun>;
348
355
  setSessionPinned(input: AgentActivityRuntimeSetSessionPinnedInput): Promise<AgentActivitySession>;
349
356
  trackSettingsProjectChange?(input: AgentActivityRuntimeTrackSettingsProjectChangeInput): Promise<void>;
350
357
  trackDraftComposerSettingsChange?(input: AgentActivityRuntimeTrackDraftComposerSettingsChangeInput): Promise<void>;
@@ -636,6 +643,11 @@ interface AgentComposerReferenceProvenanceFilter {
636
643
  }
637
644
  interface AgentComposerSubmitOptions {
638
645
  requiredSettingsPatch?: AgentActivitySubmitSettingsPatch;
646
+ capabilityRefs?: readonly AgentComposerCapabilityReference[];
647
+ }
648
+ interface AgentComposerCapabilityReference {
649
+ capability: "tutti";
650
+ source: "slash_command";
639
651
  }
640
652
  interface AgentComposerProps {
641
653
  workspaceId: string;
@@ -655,6 +667,10 @@ interface AgentComposerProps {
655
667
  disabled: boolean;
656
668
  disabledReason?: string | null;
657
669
  submitDisabled: boolean;
670
+ /** Canonical engine projection of the independent TuttiModeActivation. */
671
+ tuttiModeActive?: boolean;
672
+ /** Blocks submission/removal while activation CAS or creation is unresolved. */
673
+ tuttiModeUpdating?: boolean;
658
674
  placeholder: string;
659
675
  composerSettings: AgentGUIComposerSettingsVM;
660
676
  queueStatus?: AgentGUIQueueStatus;
@@ -694,6 +710,13 @@ interface AgentComposerProps {
694
710
  handoffMenuLabel?: string;
695
711
  labels: {
696
712
  send: string;
713
+ /**
714
+ * Plan-review send copy: with an empty-send override active the send
715
+ * button reads sendAccept on an empty draft and sendRequestChanges once
716
+ * feedback is typed, so the composer decision semantics stay legible.
717
+ */
718
+ sendAccept?: string;
719
+ sendRequestChanges?: string;
697
720
  modelLabel: string;
698
721
  modelSelectionLabel: string;
699
722
  modelContextWindowSuffix: string;
@@ -732,6 +755,15 @@ interface AgentComposerProps {
732
755
  professionalLongRunning: string;
733
756
  };
734
757
  planModeLabel: string;
758
+ tuttiModeLabel: string;
759
+ tuttiModeDescription: string;
760
+ tuttiBudgetTitle: string;
761
+ tuttiBudgetIntensityLabel: string;
762
+ tuttiBudgetIntensityMin: string;
763
+ tuttiBudgetIntensityMax: string;
764
+ tuttiBudgetConfirm: string;
765
+ tuttiBudgetCancel: string;
766
+ planModeDescription?: string;
735
767
  planModeOnLabel: string;
736
768
  planModeOffLabel: string;
737
769
  planUnavailable: string;
@@ -888,6 +920,7 @@ interface AgentComposerProps {
888
920
  computerUse?: boolean;
889
921
  permissionModeId?: string | null;
890
922
  }) => void;
923
+ onTuttiModeChange?: (active: boolean) => void;
891
924
  capabilityMenuState?: AgentComposerCapabilityMenuState;
892
925
  capabilityControlsReadOnly?: boolean;
893
926
  onCapabilitySettingsRequest?: (capability: AgentComposerCapabilitySettingsTarget) => void;
@@ -895,7 +928,19 @@ interface AgentComposerProps {
895
928
  onSlashStatusClose?: () => void;
896
929
  onSlashStatusRefresh?: () => void;
897
930
  onSubmit: (content: AgentPromptContentBlock[], displayPrompt?: string, options?: AgentComposerSubmitOptions) => void;
898
- onSubmitGuidance?: (content: AgentPromptContentBlock[], displayPrompt?: string) => void;
931
+ /**
932
+ * When set, an empty-draft send is enabled and routed here instead of being
933
+ * blocked (e.g. Tutti plan review: empty send = accept). Typed sends keep
934
+ * flowing through onSubmit.
935
+ */
936
+ onSubmitEmpty?: () => void;
937
+ /**
938
+ * Overrides the empty-draft send button copy while the empty-send override
939
+ * is active (e.g. plan review with a diverged intensity reads "Request
940
+ * changes" instead of "Accept plan"). Falls back to labels.sendAccept.
941
+ */
942
+ emptySubmitLabel?: string;
943
+ onSubmitGuidance?: (content: AgentPromptContentBlock[], displayPrompt?: string, options?: AgentComposerSubmitOptions) => void;
899
944
  onSendQueuedPromptNext: (queuedPromptId: string) => void;
900
945
  onRemoveQueuedPrompt: (queuedPromptId: string) => void;
901
946
  onEditQueuedPrompt: (queuedPromptId: string) => void;
@@ -918,7 +963,7 @@ interface AgentComposerProps {
918
963
  onRequestGitBranches?: AgentComposerGitBranchLoader | null;
919
964
  referenceProvenanceFilter?: AgentComposerReferenceProvenanceFilter | null;
920
965
  }
921
- type AgentComposerCapabilitySettingsTarget = AgentSlashCommandCapability["capability"];
966
+ type AgentComposerCapabilitySettingsTarget = Exclude<AgentSlashCommandCapability["capability"], "tutti">;
922
967
  interface AgentComposerCapabilityMenuState {
923
968
  browserUse?: {
924
969
  connectionMode?: "autoConnect" | "isolated" | null;
@@ -927,6 +972,9 @@ interface AgentComposerCapabilityMenuState {
927
972
  authorization?: AgentComposerComputerUseAuthorizationState | null;
928
973
  installed?: boolean | null;
929
974
  };
975
+ tuttiMode?: {
976
+ enabled?: boolean | null;
977
+ };
930
978
  }
931
979
  type AgentComposerComputerUseAuthorizationState = "authorized" | "needs-authorization" | "unknown";
932
980
  interface AgentComposerGitBranches {
@@ -977,6 +1025,256 @@ interface OpenAgentEnvPanelInput {
977
1025
  focus?: AgentEnvPanelFocus | null;
978
1026
  }
979
1027
 
1028
+ type TuttiModePlanWorkflowStatus = "pending_review" | "in_progress" | "accepted" | "rejected" | "completed" | "failed" | "canceled";
1029
+ type TuttiModePlanCheckpointKind = "configuration_review" | "task_review";
1030
+ type TuttiModePlanCheckpointStatus = "pending" | "accepted" | "rejected" | "superseded" | "canceled";
1031
+ interface TuttiModePlanReviewSnapshot {
1032
+ workflow: TuttiModePlanWorkflow;
1033
+ revisions: TuttiModePlanRevision[];
1034
+ checkpoints: TuttiModePlanCheckpoint[];
1035
+ }
1036
+ interface TuttiModePlanWorkflow {
1037
+ id: string;
1038
+ workspaceId: string;
1039
+ type: string;
1040
+ owner: string;
1041
+ triggerKind: string;
1042
+ sourceSessionId: string;
1043
+ sourceTurnId?: string | null;
1044
+ sourceToolCallId?: string | null;
1045
+ status: TuttiModePlanWorkflowStatus;
1046
+ currentRevisionId: string;
1047
+ }
1048
+ interface TuttiModePlanRevision {
1049
+ id: string;
1050
+ workflowId: string;
1051
+ sequence: number;
1052
+ schemaVersion: string;
1053
+ documentPath: string;
1054
+ sha256: string;
1055
+ producedByTurnId?: string | null;
1056
+ createdAtUnixMs: number;
1057
+ document: TuttiModePlanDocument;
1058
+ }
1059
+ interface TuttiModePlanDocument {
1060
+ schema: string;
1061
+ phase: "configuration" | "task_graph";
1062
+ title: string;
1063
+ topicId: string;
1064
+ markdownBody: string;
1065
+ execution: TuttiModePlanExecution;
1066
+ budget: TuttiModePlanBudget;
1067
+ tasks: TuttiModePlanTask[];
1068
+ }
1069
+ interface TuttiModePlanExecution {
1070
+ mode: "sequential" | "parallel";
1071
+ reasoningIntensity: number;
1072
+ orchestrationIntensity: number;
1073
+ }
1074
+ interface TuttiModePlanBudget {
1075
+ mode: "auto" | "fixed";
1076
+ tokenLimit: number;
1077
+ quotaWaterlinePercent: number;
1078
+ }
1079
+ interface TuttiModePlanTask {
1080
+ id: string;
1081
+ title: string;
1082
+ content: string;
1083
+ priority: "high" | "medium" | "low";
1084
+ agentTargetId?: string | null;
1085
+ modelPlanId?: string | null;
1086
+ model?: string | null;
1087
+ permissionModeId?: string | null;
1088
+ reasoningEffort?: string | null;
1089
+ executionDirectory?: string | null;
1090
+ dependsOn: string[];
1091
+ parallelizable?: boolean;
1092
+ autoAccept?: boolean;
1093
+ }
1094
+ interface TuttiModePlanCheckpoint {
1095
+ id: string;
1096
+ workflowId: string;
1097
+ kind: TuttiModePlanCheckpointKind;
1098
+ revisionId: string;
1099
+ status: TuttiModePlanCheckpointStatus;
1100
+ decidedBy?: string | null;
1101
+ decisionReason?: string | null;
1102
+ createdAtUnixMs: number;
1103
+ updatedAtUnixMs: number;
1104
+ decidedAtUnixMs?: number | null;
1105
+ }
1106
+
1107
+ interface TuttiModePlanReviewUpdate {
1108
+ kind: "workflow_updated";
1109
+ workspaceId: string;
1110
+ workflowId: string;
1111
+ sourceSessionId: string;
1112
+ checkpointId: string;
1113
+ changeKind: "proposal_created" | "revision_created" | "checkpoint_decided" | "operation_updated";
1114
+ }
1115
+ interface TuttiModePlanReviewConnectionRestored {
1116
+ kind: "connection_restored";
1117
+ workspaceId: string;
1118
+ }
1119
+ /**
1120
+ * A root turn of the source session settled. The host derives this from the
1121
+ * daemon's canonical turn fan-out and relays it as a read-repair trigger: a
1122
+ * plan proposed mid-turn announces itself through one workflow event, and if
1123
+ * that single event is lost no later workflow signal re-reads review state.
1124
+ */
1125
+ interface TuttiModePlanReviewSessionSettled {
1126
+ kind: "session_settled";
1127
+ workspaceId: string;
1128
+ sourceSessionId: string;
1129
+ }
1130
+ type TuttiModePlanReviewInvalidation = TuttiModePlanReviewUpdate | TuttiModePlanReviewConnectionRestored | TuttiModePlanReviewSessionSettled;
1131
+ interface TuttiModePlanTaskAssignmentInput {
1132
+ taskId: string;
1133
+ agentTargetId?: string | null;
1134
+ modelPlanId?: string | null;
1135
+ model?: string | null;
1136
+ permissionModeId?: string | null;
1137
+ reasoningEffort?: string | null;
1138
+ parallelizable?: boolean | null;
1139
+ autoAccept?: boolean | null;
1140
+ }
1141
+ interface TuttiModePlanReviewDecisionInput {
1142
+ workspaceId: string;
1143
+ workflowId: string;
1144
+ checkpointId: string;
1145
+ decision: "accepted" | "rejected" | "canceled";
1146
+ decidedBy: string;
1147
+ reason?: string | null;
1148
+ /** Per-task overrides; only meaningful with an accepted task review. */
1149
+ taskAssignments?: readonly TuttiModePlanTaskAssignmentInput[];
1150
+ }
1151
+ interface TuttiModePlanAssignmentAgentOption {
1152
+ agentTargetId: string;
1153
+ label: string;
1154
+ }
1155
+ interface TuttiModePlanAssignmentAgentDetail {
1156
+ /** Provider-native models usable without a model plan. */
1157
+ models: readonly string[];
1158
+ modelPlans: readonly {
1159
+ modelPlanId: string;
1160
+ label: string;
1161
+ models: readonly string[];
1162
+ }[];
1163
+ permissionModes: readonly {
1164
+ id: string;
1165
+ label: string;
1166
+ }[];
1167
+ reasoningEfforts: readonly string[];
1168
+ }
1169
+ interface TuttiPlanIssueTaskSnapshot {
1170
+ taskId: string;
1171
+ title: string;
1172
+ content: string;
1173
+ status: string;
1174
+ sortIndex: number;
1175
+ parallelizable: boolean;
1176
+ autoAccept: boolean;
1177
+ dependencyTaskIds: string[];
1178
+ }
1179
+ /** Read-only snapshot of the Issue a session's accepted plan materialized. */
1180
+ interface TuttiPlanIssueSnapshot {
1181
+ workflowId: string;
1182
+ sourceTurnId: string | null;
1183
+ issueId: string;
1184
+ topicId: string;
1185
+ title: string;
1186
+ tasks: TuttiPlanIssueTaskSnapshot[];
1187
+ }
1188
+ /**
1189
+ * An accepted plan whose create_issue operation durably failed. The
1190
+ * conversation must surface this instead of rendering nothing: there is no
1191
+ * pending checkpoint (the review panel is gone) and no Issue (the issue panel
1192
+ * never appears), so silence would hide the failure entirely.
1193
+ */
1194
+ interface TuttiPlanIssueMaterializationFailure {
1195
+ workflowId: string;
1196
+ sourceTurnId: string | null;
1197
+ errorMessage: string | null;
1198
+ }
1199
+ type TuttiPlanIssueQueryResult = {
1200
+ kind: "issue";
1201
+ issue: TuttiPlanIssueSnapshot;
1202
+ } | ({
1203
+ kind: "materialization_failed";
1204
+ } & TuttiPlanIssueMaterializationFailure) | null;
1205
+ /**
1206
+ * Read-only source for the embedded plan-issue panel in the conversation.
1207
+ * The host resolves "the Issue this session's accepted plan created" and
1208
+ * relays live issue updates; all mutations stay in the Issue Manager.
1209
+ */
1210
+ interface TuttiPlanIssueSource {
1211
+ getSessionPlanIssue(input: {
1212
+ workspaceId: string;
1213
+ sourceSessionId: string;
1214
+ }): Promise<TuttiPlanIssueQueryResult>;
1215
+ subscribeIssueUpdates(workspaceId: string, listener: (update: {
1216
+ issueId: string;
1217
+ }) => void): () => void;
1218
+ /** Accepts a pending-acceptance task (the human gate) from the embed. */
1219
+ acceptTask(input: {
1220
+ workspaceId: string;
1221
+ issueId: string;
1222
+ taskId: string;
1223
+ }): Promise<void>;
1224
+ /** Sends a pending-acceptance task back to rework (re-dispatch). */
1225
+ rejectTask(input: {
1226
+ workspaceId: string;
1227
+ issueId: string;
1228
+ taskId: string;
1229
+ }): Promise<void>;
1230
+ /**
1231
+ * Stops the Issue's execution: pauses future dispatch and cancels every
1232
+ * running task run. Idempotent; the daemon owns the cascade.
1233
+ */
1234
+ cancelExecution(input: {
1235
+ workspaceId: string;
1236
+ issueId: string;
1237
+ }): Promise<void>;
1238
+ /**
1239
+ * Resolves the delegate agent session that ran (or is running) a task's
1240
+ * latest run, so a task card can jump straight into that conversation.
1241
+ * Null when the task has not launched yet.
1242
+ */
1243
+ resolveTaskSession(input: {
1244
+ workspaceId: string;
1245
+ issueId: string;
1246
+ taskId: string;
1247
+ }): Promise<{
1248
+ agentSessionId: string;
1249
+ } | null>;
1250
+ }
1251
+ /**
1252
+ * Option catalogs for per-task assignment editing. The desktop host reuses
1253
+ * its agent directory and composer capability catalogs; the panel never
1254
+ * hardcodes providers or modes.
1255
+ */
1256
+ interface TuttiModePlanAssignmentOptionsSource {
1257
+ listAgents(input: {
1258
+ workspaceId: string;
1259
+ }): Promise<readonly TuttiModePlanAssignmentAgentOption[]>;
1260
+ loadAgentOptions(input: {
1261
+ workspaceId: string;
1262
+ agentTargetId: string;
1263
+ }): Promise<TuttiModePlanAssignmentAgentDetail>;
1264
+ }
1265
+ interface TuttiModePlanReviewRuntime {
1266
+ listPending(input: {
1267
+ workspaceId: string;
1268
+ sourceSessionId: string;
1269
+ }): Promise<readonly TuttiModePlanReviewSnapshot[]>;
1270
+ decide(input: TuttiModePlanReviewDecisionInput): Promise<void>;
1271
+ subscribe(workspaceId: string, listener: (update: TuttiModePlanReviewInvalidation) => void): () => void;
1272
+ /** Optional; the panel degrades to read-only assignment display without it. */
1273
+ assignmentOptions?: TuttiModePlanAssignmentOptionsSource;
1274
+ /** Optional; without it the embedded plan-issue panel never renders. */
1275
+ planIssues?: TuttiPlanIssueSource;
1276
+ }
1277
+
980
1278
  type AgentMentionReferenceTargetResolver = (item: AgentContextMentionItem) => ReferenceLocateTarget | null;
981
1279
  interface AgentWorkspaceReferenceInitialTargetInput {
982
1280
  activeConversation: AgentGUINodeViewModel["rail"]["activeConversation"];
@@ -1039,11 +1337,6 @@ interface AgentGUIRememberComposerDefaultsResult {
1039
1337
  supersededFields: AgentGUIComposerDefaultsField[];
1040
1338
  }
1041
1339
 
1042
- interface AgentGUIOpenSessionRequest {
1043
- agentSessionId: string;
1044
- sequence: number;
1045
- }
1046
-
1047
1340
  type AgentGUIComposerAppendRequest = {
1048
1341
  files: readonly AgentComposerDraftFile[];
1049
1342
  prompt?: string;
@@ -1058,11 +1351,18 @@ interface AgentGUIPrefillPromptRequest {
1058
1351
  agentTargetId?: string | null;
1059
1352
  autoSubmit?: boolean;
1060
1353
  draftPrompt: string;
1354
+ model?: string | null;
1355
+ modelPlanId?: string | null;
1061
1356
  provider?: AgentGUIProvider;
1062
1357
  sequence: number;
1063
1358
  userProjectPath?: string | null;
1064
1359
  }
1065
1360
 
1361
+ interface AgentGUIOpenSessionRequest {
1362
+ agentSessionId: string;
1363
+ sequence: number;
1364
+ }
1365
+
1066
1366
  type AgentStatusSectionState = "available" | "unavailable" | "error";
1067
1367
  type AgentStatusRequestReason = "slash-status" | "agent-info" | "agent-config";
1068
1368
  interface AgentStatusQuery {
@@ -1194,6 +1494,7 @@ interface AgentGUINodeHostActions {
1194
1494
  agentTargetId?: string | null;
1195
1495
  draftPrompt: string;
1196
1496
  provider: AgentGUIProvider;
1497
+ sourceAgentSessionId: string;
1197
1498
  userProjectPath?: string | null;
1198
1499
  }) => void | Promise<void>;
1199
1500
  onCapabilitySettingsRequest?: (capability: AgentComposerCapabilitySettingsTarget) => void;
@@ -1245,6 +1546,7 @@ interface AgentGUIProps extends Omit<AgentGUINodeProps, "hostCapabilities" | "re
1245
1546
  renderAgentsEmpty?: AgentGUIAgentsEmptyRenderer;
1246
1547
  agentActivityRuntime: AgentActivityRuntime;
1247
1548
  agentHostApi?: AgentHostInputApi | null;
1549
+ tuttiModePlanReviewRuntime?: TuttiModePlanReviewRuntime | null;
1248
1550
  /** Starter entries to hide below the empty new-session composer. */
1249
1551
  disabled?: readonly AgentGUIHomeSuggestionId[];
1250
1552
  i18n?: I18nRuntime<string> | null;